Repository navigation
Room pills move aside instead of vanishing; saves skip placement drafts - #1020
Merged
Merged
Conversation
Clicking a preset tile clones it into the level before any click, and the window/door tools keep a hover draft in the store; every save read the raw store, so an unplaced window could be autosaved (and survive a reload). Saves now go through getSavedSceneDocument, which leaves out drafts an interaction owns (beginSceneHistoryDraft, the active move-tool scope) and keeps moved nodes at their pre-move state; GLB/JSON exports use it too. Nodes are not filtered by isNew: placed nodes can keep that flag. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RzGbHVg2Tpv4zEw9yLaT5X
Pill sizes were measured once, so fonts arriving, renames or unit changes left pills overlapping while the declutter hid others. Sizes are now observed, and a placement pass (larger room first) keeps a pill on its room, nudges it to the nearest free slot within one pill height, collapses it to its colour dot (which also shifts, and expands on hover) and hides it only as a last resort; applied at camera rest with eased style writes. 3D pills render in an isolated layer inside the canvas, the 2D pane inside the plan, so panels always sit above. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RzGbHVg2Tpv4zEw9yLaT5X
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 75c9ab9. Configure here.
| if (!node) { | ||
| excludedObjects.add(original) | ||
| continue | ||
| } |
There was a problem hiding this comment.
Exports keep draft opening cutouts
Medium Severity
GLB and USDZ export now drop placement drafts from the saved node graph and skip their registry meshes, but they still clone the live host geometry. A wall that already has a cutout for an in-progress window or door therefore exports with a hole and no opening.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 75c9ab9. Configure here.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


What does this PR do?
Room pills move aside instead of vanishing, and sit under the UI.
Saves never include a placement draft.
getSavedSceneDocument. It leaves out drafts an interaction owns (beginSceneHistoryDraft, the active move-tool scope) and keeps moved nodes at their pre-move state.isNew: placed nodes can keep that flag.How to test
Automated: editor, core and nodes suites pass locally.
Screenshots / screen recording
Not added yet.
Checklist
bun devbun checkto verify)mainbranch🤖 Generated with Claude Code
https://claude.ai/code/session_01RzGbHVg2Tpv4zEw9yLaT5X
Note
Medium Risk
Changes what gets written on autosave/export and how history snapshots omit drafts—high user impact if draft ownership is wrong—but behavior is heavily covered by new tests across core, editor, and nodes.
Overview
Saves and exports now read a “document” view of the scene instead of the live store, so in-progress placement never persists. Core adds
getSceneDocument(and editorgetSavedSceneDocument) built fromwithoutDraftSubtrees: it strips only explicit carry drafts (beginSceneHistoryDraft, active move-tool scope) and still treatsmetadata.isNewfresh placements as non-document for undo snapshots—but does not drop committed nodes just because they still haveisNew. Autosave, JSON export, and GLB/USDX/etc. paths use this; GLB prep also skips registry meshes whose nodes are absent from the saved graph.Room labels replace distance-based hide-on-overlap with placement: larger rooms first, then vertical nudges, collapse to a hover-expand dot, hide only when needed. Pills re-place when the camera rests (not while orbiting), sizes track ResizeObserver / fonts, and 3D/2D pills render in isolated layers under editor UI. Hidden zones no longer get pills.
Door/window draw and move tools register placement/move drafts via
beginSceneHistoryDraft/runSceneHistoryDraftWriteso live drags stay out of history and saved document until commit.Reviewed by Cursor Bugbot for commit 75c9ab9. Bugbot is set up for automated code reviews on this repo. Configure here.